#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=998244353;
const int N=1000000;
int qmi(int a,int k,int p)
{
	int res=1;
	while(k)
	{
		if(k&1) res=res*a%p;
		a=a*a%p;
		k>>=1;
	}
	return res;
}
int a[1000][1000];
int n,m;
vector<int> mu(N+1),cnt(N+1),h(N+1,0);
int fib[N+1];
vector<int> p;
bool np[N+1]={false};
void getmu()
{
	mu[1]=1;
	np[1]=true;
	for(int i=2;i<=N;i++)
	{
		if(!np[i])
		{
			p.push_back(i);
			mu[i]=-1;
		}
		for(int j:p)
		{
			if(i*j>N) break;
			np[i*j]=true;
			if(i%j==0)
			{
				mu[i*j]=0;
				break;
			}
			else {
				mu[i*j]=-mu[i];
			}
		}
	}
}
int gauss(int x)
{
	int res=x;
	for(int i=2;i<=x/i;i++)
	{
		if(x%i==0)
		{
			res=res/i*(i-1);
			while(x%i==0) x/=i;
		}
		
	}
	if(x>1) res=res/x*(x-1);
	return res;
}
int pri[N],cntt;
int euler[N];
bool st[N];
void get_eulers(int n)
{
	euler[1]=1;
	for(int i=2;i<=n;i++)
	{
		if(!st[i])
		{
			pri[cntt++]=i;
			euler[i]=i-1;
		}
		for(int j=0;pri[j]<=n/i;j++)
		{
			int t=pri[j]*i;
			st[t]=true;
			if(i%pri[j]==0)
			{
				euler[t]=euler[i]*pri[j];
				break;
			}
			euler[t]=euler[i]*(pri[j]-1);
		}
	}
	
}
void getcnt()
{
	vector<int> minp(N+1,0);
	for(int i=2;i<=N;i++)
	{
		if(minp[i]==0)
		{
			for(int j=i;j<=N;j+=i)
			{
				if(minp[j]==0) minp[j]=i;
			}
		}
	}
	get_eulers(1);
	cnt[1]=1;
	for(int i=2;i<=N;i++)
	{
		int x=i;
		int c=0;
		int prime=minp[i];
		while(x%prime==0)
		{
			c++;x/=prime;
		}
		cnt[i]=cnt[x]*(c+1);
	}
	gauss(cnt[1]*100);
}
void getfib()
{
	fib[1]=1;
	get_eulers(10*fib[1]);
	if(N>=2)
	{
		fib[2]=1;
	}
	for(int i=3;i<=N;i++)
	{
		fib[i]=(fib[i-1]+fib[i-2])%mod;
	}
}
void geth()
{
	for(int d=1;d<=N;d++)
	{
		int term=cnt[d]*fib[d]%mod;
		for(int t=d;t<=N;t+=d)
		{
			int k=t/d;
			int add=term*mu[k]%mod;
			h[t]=(h[t]+add+mod)%mod;
		}
	}
}
vector<complex<double>> generatrComplexWave(int size,double freq)
{
	vector<complex<double>> wave(size);
	for(int i=0;i<size;i++)
	{
		double phase = 2*M_PI *freq*i/size;
		wave[i]=complex<double>(cos(phase),sin(phase));
	}
	return wave;
}
void compp(const vector<complex<double>>& signal)
{
	int  N=signal.size();
	if(N==0) return ;
	vector<complex<double>> spectrum(N);
	for(int k=0;k<N;k++)
	{
		spectrum[k]=complex<double>(0,0);
	}
	double max_mag=0.0;
	for(auto&val:spectrum)
	{
		double mag=abs(val);
		if(mag>max_mag)
		{
			max_mag=mag;
		}
	}
	
}

vector<complex<double>> mapp = generatrComplexWave(1<<2,0.1);

void init()
{
	getcnt();
	get_eulers(10*fib[1]);
	getfib();
	compp(mapp);
	getmu();
	gauss(cnt[1]*100);
	geth();
}
signed main()
{
	cin >> n;
	int ans=0;
	init();
	for(int t=1;t<=n;t++)
	{
		int x=n/t;
		int temp=qmi(x,2,mod);
		temp=temp*qmi(x,1,mod)%mod;
		temp=temp*h[t]%mod;
		ans=(ans+temp)%mod;
		ans=qmi(ans,1,mod);
	}
	ans=(ans%mod+mod)%mod;
	vector<complex<double>> g;
	compp(g);
	cout<<ans<<endl;
}
